﻿using System;
using System.Collections;
using System.Linq;
using System.Text;
using System.Drawing;
using System.IO;

namespace ConcertSpace
{
    
    public class Groupe : IComparable
    {
        public string Nom;
        public string NomMyspace;
        public string urlMyspace;
        public string urlMyspaceEvents;

        public Bitmap image_profil;

        public ArrayList concerts;

        public int CompareTo(object obj)
        {
            Groupe autre_groupe = obj as Groupe;
            if (autre_groupe != null)
                return this.Nom.CompareTo(autre_groupe.Nom);
            else
                throw new ArgumentException("Object is not a Groupe");
        }
    }

    public class CaMinteresse : IComparable
    {
        public string Nom_Groupe;
        public string date_myspace;
        public DateTime date;
        public string titre;
        public string heure;
        public string lieu;

        public int CompareTo(object obj)
        {
            CaMinteresse autre_ca_minteresse = obj as CaMinteresse;
            if (autre_ca_minteresse != null)
                return this.date.CompareTo(autre_ca_minteresse.date);
            else
                throw new ArgumentException("Object is not a Ca_Minteresse");
        }
    }

    public class GestionConcertsMyspace
    {
        ArrayList groupes = new ArrayList();    // Liste qui contient tous les groupes (avec leurs concerts) que l'utilisateur a choisi de suivre
        ArrayList groupes_old = new ArrayList(); // Liste qui contient les groupes (avec leurs concerts) chargés lors du dernier chargement de l'appli
        ArrayList nouveautes = new ArrayList(); // Liste qui contient les nouveautés depuis le dernier chargement de l'appli
        ArrayList ca_minteresse = new ArrayList();
        ExtracteurHTML extr = new ExtracteurHTML();

        public string criteres_alerte = "";

        public string adresse = "Paris";

        public string RemoveDiacritics(string text)
        {
            return System.Text.Encoding.ASCII.GetString(System.Text.Encoding.GetEncoding(1251).GetBytes(text));
        }

        private Bitmap getBitmapSiImageExisteDeja(Concert c)
        {
            Bitmap b = null;
            for (int i = 0; i < groupes.Count; i++)
            {
                for (int j = 0; j < ((Groupe)groupes[i]).concerts.Count; j++)
                {
                    if (((Concert)((Groupe)groupes[i]).concerts[j]).chemin_img == c.chemin_img)
                    {
                        if (((Concert)((Groupe)groupes[i]).concerts[j]).image != null)
                        {
                            // L'image a déjà été chargée pour un autre concert
                            b = ((Concert)((Groupe)groupes[i]).concerts[j]).image;

                            break;
                        }
                    }
                }

                if (b != null)
                {
                    break;
                }
            }

            // Si a la fin aucune image n'est trouvée, alors on la charge depuis internet
            if (b == null)
            {
                b = extr.getImageFromWeb(c.chemin_img);
            }

            return b;
        }

        private void getConcerts(ref Groupe groupe)
        {
            int retour = 0;
            int compte = 1;

            groupe.concerts.Clear();

            if (groupe.urlMyspaceEvents != "")
            {
                retour = extr.getConcerts(groupe.urlMyspaceEvents, ref groupe.concerts);
                /*do
                {
                    retour = extr.getConcerts(groupe.urlMyspaceEvents + compte, ref groupe.concerts);
                    compte++;
                // Regarder la page suivante uniquement si on a lu plus de 10 éléments
                } while (retour == 10);*/
                //} while (retour > 0);

                // Charger les images des concerts en gérant le fait qu'il puisse y avoir des doublons
                /*for (int i = 0; i < groupe.concerts.Count; i++)
                {
                    Concert c = ((Concert)groupe.concerts[i]);
                    c.image = getBitmapSiImageExisteDeja(c);
                    groupe.concerts[i] = c;
                }*/
            }
        }

        public void ajouterGroupe(string nom, string urlMyspace)
        {
            /*Groupe g_tmp = extr.getInfosFromMyspaceProfilePage(urlMyspace);
            ajouterGroupe(nom, urlMyspace, g_tmp.urlMyspaceEvents);*/
            ajouterGroupe(nom, urlMyspace, "");
        }
        public void ajouterGroupe(string nom, string urlMyspace, string urlMyspaceEvents)
        {
            Groupe g = new Groupe();
            g.Nom = nom;
            g.urlMyspace = urlMyspace;

            Groupe g_tmp = extr.getInfosFromMyspaceProfilePage(urlMyspace);
            g.image_profil = g_tmp.image_profil;

            // Si l'url est vide, il faut essayer de le trouver...
            //if (urlMyspaceEvents != "")
            if (g_tmp.urlMyspaceEvents == "" || urlMyspaceEvents == g_tmp.urlMyspaceEvents)
            {
                g.urlMyspaceEvents = urlMyspaceEvents;
            }
            else
            {
                g.urlMyspaceEvents = g_tmp.urlMyspaceEvents;   
            }

            g.concerts = new ArrayList();

            groupes.Add(g);
            
            getConcerts(ref g);

            groupes[groupes.Count - 1] = g;

            // Mettre à jour la liste des nouveautés
            bool trouve = false;
            for(int i = 0;i<groupes_old.Count;i++)
            {
                Groupe g_nouveaute = new Groupe();  // groupe temporaire qui contiendra le groupe et les eventuels nouveaux concerts
                g_nouveaute.Nom = g.Nom;
                g_nouveaute.urlMyspace = g.urlMyspace;
                g_nouveaute.urlMyspaceEvents = g.urlMyspaceEvents;
                g_nouveaute.concerts = new ArrayList();
                
                Groupe g_old = ((Groupe)groupes_old[i]);
                if (g_old.Nom == g.Nom)
                {
                    for (int j = 0; j < g.concerts.Count; j++)
                    {
                        Concert c_new = ((Concert)g.concerts[j]);
                        for (int k = 0; k < g_old.concerts.Count; k++)
                        {
                            Concert c_old = ((Concert)g_old.concerts[k]);
                            DateTime d_old = extr.getDateTimeFromText(c_old.date);
                            DateTime d_new = extr.getDateTimeFromText(c_new.date);

                            //if (c_old.date == c_new.date && c_old.heure == c_new.heure)
                            if (d_old.Day == d_new.Day && d_old.Month == d_new.Month && d_old.Year == d_new.Year && c_old.heure == c_new.heure)
                            {
                                trouve = true;
                                break;
                            }
                        }

                        // Si on n'a pas trouvé le concert, c'est que ca en est un nouveau
                        if (trouve == false)
                        {
                            // Ajouter le concert à la nouveauté du groupe
                            g_nouveaute.concerts.Add(c_new);
                        }

                        // RAZ du flag, on passe à un autre concert
                        trouve = false;
                    }
                }

                // Une fois qu'on a passé tous les concerts, si on a trouvé au moins un nouveau concert...
                if (g_nouveaute.concerts.Count >= 1)
                {
                    // On ajoute le groupe (avec ses nouveaux concerts) aux nouveautés
                    nouveautes.Add(g_nouveaute);
                }
            }

            // Trier dans l'ordre alphabétique en fonction du nom groupe
            groupes.Sort();
        }

        public int chercher_CaMinteresse(string nom_groupe, Concert concert)
        {
            int retour = -1;

            for (int i = 0; i < ca_minteresse.Count; i++)
            {
                if (((CaMinteresse)ca_minteresse[i]).Nom_Groupe == nom_groupe)
                {
                    if (((CaMinteresse)ca_minteresse[i]).date_myspace == concert.date)
                    {
                        if (((CaMinteresse)ca_minteresse[i]).lieu == concert.lieu)
                        {
                            if (((CaMinteresse)ca_minteresse[i]).titre == concert.titre)
                            {
                                if (((CaMinteresse)ca_minteresse[i]).heure == concert.heure)
                                {
                                    retour = i;
                                    break;
                                }
                            }
                        }
                    }
                }
            }

            return retour;
        }

        // Renvoie 1 si réussi, 0 si groupe existant
        public int ajouterCaMinteresse(string nom_groupe, Concert concert)
        {
            int retour = 0;
            // Si l'évenement n'est pas déja répertorié
            if (chercher_CaMinteresse(nom_groupe, concert) == -1)
            {
                // L'ajouter aux ca m'interesse
                CaMinteresse c_m = new CaMinteresse();
                c_m.Nom_Groupe = nom_groupe;
                c_m.date_myspace = concert.date;
                c_m.date = extr.getDateTimeFromText(concert.date);
                c_m.heure = concert.heure;
                c_m.lieu = concert.lieu;
                c_m.titre = concert.titre;

                ca_minteresse.Add(c_m);

                ca_minteresse.Sort();

                retour = 1;
            }

            return retour;
        }

        public void enleverGroupe(string nom)
        {
            Groupe g_s;
            for(int i = 0;i<groupes.Count;i++)
            {
                g_s = (Groupe)groupes[i];
                if(g_s.Nom == nom)
                {
                    groupes.RemoveAt(i);
                    break;
                }
            }
        }

        public void enleverCaMinteresse(int index)
        {
            ca_minteresse.RemoveAt(index);
        }

        public int verifier_si_groupe_existe_deja(string nom)
        {
            int trouve = -1;

            for (int i = 0; i < groupes.Count; i++)
            {
                if (RemoveDiacritics(((Groupe)groupes[i]).Nom).ToLower() == RemoveDiacritics(nom).ToLower())
                {
                    trouve = i;
                    break;
                }
            }

            return trouve;
        }

        public int chercher_concert(Groupe g, string lieu)
        {
            int trouve = -1;

            for (int i = 0; i < g.concerts.Count; i++)
            {
                if (RemoveDiacritics(((Concert)g.concerts[i]).lieu).ToLower() == RemoveDiacritics(lieu).ToLower())
                {
                    trouve = i;
                    break;
                }
            }

            return trouve;
        }


        public void modifierGroupe(int index, string nom)
        {
            Groupe g = ((Groupe)groupes[index]);
            g.Nom = nom;
            groupes[index] = g;
        }

        public Groupe getGroupe(int index)
        {
            return (Groupe)groupes[index];
        }
        public int getGroupeCount()
        {
            return groupes.Count;
        }

        public CaMinteresse getCaMinteresse(int index)
        {
            return (CaMinteresse)ca_minteresse[index];
        }
        public int getCaMinteresseCount()
        {
            return ca_minteresse.Count;
        }

        public Groupe getNouveautes(int index)
        {
            return (Groupe)nouveautes[index];
        }
        public int getNouveautesCount()
        {
            return nouveautes.Count;
        }

        public void Enregistrer()
        {
            Encoding enc = Encoding.GetEncoding(1252);  // Windows default Code Page
            try
            {
                StreamWriter sw = new StreamWriter("options.opt",false,enc);

                sw.WriteLine(adresse);

                sw.Close();
            }
            catch (Exception e)
            {
            }

            try
            {
                StreamWriter sw = new StreamWriter("groupes.gps", false, enc);

                for (int i = 0; i < groupes.Count; i++)
                {
                    sw.WriteLine(((Groupe)groupes[i]).Nom);
                    sw.WriteLine(((Groupe)groupes[i]).urlMyspace);
                    sw.WriteLine(((Groupe)groupes[i]).urlMyspaceEvents);
                }
                sw.Close();
            }
            catch (Exception e)
            {
            }

            try
            {
                StreamWriter sw = new StreamWriter("groupes_et_concerts.gcs", false, enc);

                for (int i = 0; i < groupes.Count; i++)
                {
                    sw.WriteLine(((Groupe)groupes[i]).Nom);
                    sw.WriteLine(((Groupe)groupes[i]).urlMyspace);
                    sw.WriteLine(((Groupe)groupes[i]).concerts.Count);
                    for (int j = 0; j < ((Groupe)groupes[i]).concerts.Count; j++)
                    {
                        Concert c_tmp = ((Concert)((Groupe)groupes[i]).concerts[j]);
                        sw.WriteLine(c_tmp.titre);
                        sw.WriteLine(c_tmp.lieu);
                        sw.WriteLine(c_tmp.date);
                        sw.WriteLine(c_tmp.heure);
                    }
                }
                sw.Close();
            }
            catch (Exception e)
            {
            }

            try
            {
                StreamWriter sw = new StreamWriter("ca minteresse.gps", false, enc);
                for (int i = 0; i < ca_minteresse.Count; i++)
                {
                    sw.WriteLine(((CaMinteresse)ca_minteresse[i]).Nom_Groupe);
                    sw.WriteLine(((CaMinteresse)ca_minteresse[i]).date_myspace);
                }
                sw.Close();
            }
            catch (Exception e)
            {
            }

            try
            {
                StreamWriter sw = new StreamWriter("criteres.ctr", false, enc);
                sw.Write(criteres_alerte);
                sw.Close();
            }
            catch (Exception e)
            {
            }
        }

        public void Ouvrir()
        {
            Ouvrir(null);
        }

        public void Ouvrir(OuvreEtMetAJour fct_maj)
        {
            Encoding enc = Encoding.GetEncoding(1252);  // Windows default Code Page
            try
            {
                StreamReader sr = new StreamReader("options.opt", enc);
                adresse = sr.ReadLine();
                sr.Close();
            }
            catch (FileNotFoundException e)
            {
                // C'est certainement la premiere fois qu'on lance l'application, donc on demande l'adresse du mec
                GestionConcertsMyspace g = new GestionConcertsMyspace();
                frmOptions options = new frmOptions(ref g);
                options.ShowDialog();
                options = null;

                adresse = g.adresse;
            }

            try
            {
                StreamReader sr = new StreamReader("criteres.ctr", enc);
                criteres_alerte = sr.ReadToEnd();
                sr.Close();
            }
            catch (Exception e)
            {
            }

            try
            {
                StreamReader sr = new StreamReader("ca minteresse.gps", enc);
                do
                {
                    CaMinteresse c_m = new CaMinteresse();
                    c_m.Nom_Groupe = sr.ReadLine();
                    c_m.date_myspace = sr.ReadLine();
                    c_m.date = extr.getDateTimeFromText(c_m.date_myspace);

                    ca_minteresse.Add(c_m);

                } while (sr.Peek() != -1);
                ca_minteresse.Sort();

                sr.Close();
            }
            catch (Exception e)
            {
            }

            try
            {
                StreamReader sr = new StreamReader("groupes_et_concerts.gcs", enc);

                int n_concerts;
                do
                {
                    Groupe g_tmp = new Groupe();
                    g_tmp.concerts = new ArrayList();

                    g_tmp.Nom = sr.ReadLine();
                    g_tmp.urlMyspace = sr.ReadLine();

                    n_concerts = int.Parse(sr.ReadLine());

                    for (int i = 0; i < n_concerts; i++)
                    {
                        Concert c_tmp = new Concert();
                        c_tmp.titre = sr.ReadLine();
                        c_tmp.lieu = sr.ReadLine();
                        c_tmp.date = sr.ReadLine();
                        c_tmp.heure = sr.ReadLine();

                        g_tmp.concerts.Add(c_tmp);
                    }
                    groupes_old.Add(g_tmp);
                    
                } while (sr.Peek() != -1);
                sr.Close();
            }
            catch (Exception e)
            {
            }

            //try
            {
                StreamReader sr = new StreamReader("groupes.gps", enc);

                string nom, urlMyspace, urlMyspaceEvents;
                do
                {
                    nom = sr.ReadLine();
                    urlMyspace = sr.ReadLine();
                    urlMyspaceEvents = sr.ReadLine();

                    ajouterGroupe(nom, urlMyspace, urlMyspaceEvents);

                    if (fct_maj != null)
                    {
                        fct_maj();
                    }
                } while (sr.Peek() != -1);
                sr.Close();
            }/*
            catch (Exception e)
            {
            }*/


            // Vérifier les Ca m'interesse pour voir s'il n'y a pas eu de changements
            bool trouve = false;
            for (int i = 0; i < ca_minteresse.Count; i++)
            {
                CaMinteresse c_m = ((CaMinteresse)ca_minteresse[i]);

                for(int j = 0;j<groupes.Count;j++)
                {
                    Groupe g_tmp = ((Groupe)groupes[j]);
                    if (c_m.Nom_Groupe == g_tmp.Nom)
                    {
                        for (int k = 0; k < g_tmp.concerts.Count; k++)
                        {
                            DateTime date_myspace = extr.getDateTimeFromText(c_m.date_myspace);
                            DateTime date_concert = extr.getDateTimeFromText(((Concert)g_tmp.concerts[k]).date);

                            //if (c_m.date_myspace == ((Concert)g_tmp.concerts[k]).date)
                            if(date_myspace.Day == date_concert.Day && date_myspace.Month == date_concert.Month && date_myspace.Year == date_concert.Year)
                            {
                                // On l'a trouvé, on charge alors les infos
                                c_m.heure = ((Concert)g_tmp.concerts[k]).heure;
                                c_m.titre = ((Concert)g_tmp.concerts[k]).titre;
                                c_m.lieu = ((Concert)g_tmp.concerts[k]).lieu;

                                ca_minteresse[i] = c_m;

                                trouve = true;
                                break;
                            }
                        }

                        // On a fait tous les concerts mais on n'a pas trouvé la date indiquée par l'user...
                        if (trouve == false)
                        {
                            // C'est que la date est peut etre passée, ou alors que le concert a été supprimé, modifié...
                            // On supprime la date de la liste
                            ca_minteresse.RemoveAt(i);
                        }

                        // Arrivé ici, on a trouvé le groupe qui correspond au "ca m'interesse", donc on peut passer au suivant sans continuer à chercher le groupe
                        break;

                    }
                }
            }
        }
    }
}
